package com.skilltrackedu.config;

import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 类功能说明
 * LocalDateTimeConfig 类的作用是确保系统在处理日期和时间时，格式统一且正确。具体来说，它做了三件事：
 * 把日期时间转成字符串：
 * 当服务端要把日期时间（比如：2023-10-05 14:30:00）发送给客户端时，需要把它变成字符串格式，这样浏览器或其他客户端才能正确显示。
 * 把字符串转成日期时间：
 * 当客户端（比如：网页或手机应用）向服务端发送日期时间（比如：2023-10-05 14:30:00）时，服务端需要把它从字符串格式转换回日期时间对象，以便进行处理。
 * 全局配置：
 * 把上面的转换规则应用到整个应用程序中，确保所有地方处理 LocalDateTime 类型的数据时都使用相同的格式。
 * 通过这些配置，系统可以避免日期时间格式不一致的问题，保证数据传输的准确性和一致性。简单来说，就是让系统的日期时间处理更加规范和可靠。
 */
@Configuration
public class LocalDateTimeConfig {

    /*
     * 序列化内容
     *   LocalDateTime -> String
     * 服务端返回给客户端内容
     * */
    @Bean
    public LocalDateTimeSerializer localDateTimeSerializer() {
        return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    /*
     * 反序列化内容
     *   String -> LocalDateTime
     * 客户端传入服务端数据
     * */
    @Bean
    public LocalDateTimeDeserializer localDateTimeDeserializer() {
        return new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }


    // 配置Jackson序列化和反序列化策略
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        // 自定义Jackson2ObjectMapperBuilder配置
        return builder -> {
            // 使用自定义序列化器处理LocalDateTime类型
            builder.serializerByType(LocalDateTime.class, localDateTimeSerializer());
            // 使用自定义反序列化器处理LocalDateTime类型
            builder.deserializerByType(LocalDateTime.class, localDateTimeDeserializer());
        };
    }

}